#include <stdio.h>
#include <stdlib.h>

int disponivel = 1000; //quantidade disponivel de dinheiro no caixa eletronico

//flag recebe 0 se é cliente e 1 se é gerente
typedef struct Conta{
        char *nome;
        int nconta;
        int senha;
        double saldo;
        int flag;
        struct Conta *prox;
}conta;

//DAQUI PARA BAIXO O DALVAN QUE MANDOU

void deposito(conta **cont){
        system("clear || cls");
        printf("_-_-_-_-_-_-_-_-_-_-_-_-_-_-_- CAIXA ELETRONICO _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-\n\n");
        double valor;
        int contarecebe;
        conta *l;
        
        printf("Digite o numero da conta destino: ");
        scanf("%d",&contarecebe);
        
        for(l = *cont; l != NULL; l = l->prox){
        	if(l->nconta == contarecebe){
		    	printf ("\n\nInforme o valor do deposito: ");
		    	scanf("%lf", &valor);
		    	(*cont)->saldo=(*cont)->saldo + valor;
		    	printf ("\n\n ==>Deposito efetuado com sucesso\n");
		    	getchar();
        		return;
        	}
        }
        printf("Conta nao encontrada\n");
        getchar();
        getchar();
        return;
}

void mostrarSaldo(conta **cont){
        printf ("\n\tSaldo: %f\n", (*cont)->saldo);
        getchar();
        getchar();
}



//DAQUI PRA BAIXO MARIO QUE MANDOU
void saque(conta **c){
        system("clear || cls");
        int valor;
        printf("Valor para saque: ");
        scanf("%d", &valor);
        if(valor <= (*c)->saldo && valor <= disponivel){
                (*c)->saldo = (*c)->saldo - valor;
                disponivel = disponivel - valor;
                printf("Saque efetuado com sucesso\n");
        }
        else{
                if(valor > (*c)->saldo){
                        printf("O valor desejado é maior que o saldo da conta.\n");
                        getchar();
                        getchar();
                }
                if(valor > disponivel){
                        printf("O valor desejado é maior que o valor disponivel no caixa eletronico\n");
                        getchar();
                        getchar();
                }
        }
}

//DAQUI PARA BAIXO RICARDO QUE MANDOU
void AbreConta(conta **cont){
        system("clear || cls");
        conta *t;
        for(t = *cont; t->prox != NULL; t = t->prox);
        
        conta *novo = (conta*) malloc(sizeof(conta));
        novo->nome = (char*) malloc(100*sizeof(conta));
        printf("Digite o Nome: ");
        scanf("%s",novo->nome);
        printf("Digite a conta: ");
        scanf("%d",&novo->nconta);
        printf("Digite a senha: ");
        scanf("%d",&novo->senha);
        novo->saldo = 0;
        char resp = 'o';
        //Dando doideira, tem que limpar o lixo que ta no buffer ;/
        //bug corrigido aqui <---Dalvan
        while(resp != 'n' && resp != 's'){
                printf("Essa conta tera acesso de Gerente[S/n]: ");
                scanf(" %c",&resp);
                if(resp == 'n'){
                        novo->flag = 0;
                }else{
                        if(resp == 's'){
                                novo->flag = 1;
                        }else{
                                printf("DIGITE APENAS s OU n\n");
                        }
                }
        }
                
        novo->prox = NULL;
        t->prox = novo;
        return;            
}

void menuGerente(conta **cont){
        int resp = -1;
        while(resp != 3){
                system("clear || cls");
                printf("Bem vindo a sua conta\n1 - Criar Conta\n2 - Deletar Conta\n3 - Sair\n");
                printf("O que deseja fazer: ");
                scanf("%d",&resp);
                if(resp == 1)
                   AbreConta(cont);
                if(resp == 2){
                        //cont = DeletaConta(cont);
                }

        }
        return;
}

void menuUsuario(conta **cont){
        int resp = -1;
        while(resp != 3){
                system("clear || cls");
                printf("Bem vindo a sua conta\n1 - Saque\n2 - Mostrar saldo\n3 - Sair\n");
                printf("O que deseja fazer: ");
                scanf("%d",&resp);
                if(resp == 1)
                     saque(cont);
                if(resp == 2){
                     mostrarSaldo(cont);
                }

        }
        return;
}
        

void IniciaCaixa(conta **cont){
        conta *novo = (conta*) malloc(sizeof(conta));
        novo->nome = "Gerente";
        novo->nconta = 666;
        novo->senha = 999;
        novo->saldo = 0;
        novo->flag = 1;
        novo->prox = NULL;
        
        conta *novo2 = (conta*) malloc(sizeof(conta));
        novo2->nome = "Mario";
        novo2->nconta = 24;
        novo2->senha = 11;
        novo2->saldo = 0;
        novo2->flag = 0;
        novo2->prox = novo;
        
        conta *novo3 = (conta*) malloc(sizeof(conta));
        novo3->nome = "Dalvan";
        novo3->nconta = 22;
        novo3->senha = 22;
        novo3->saldo = 0;
        novo3->flag = 0;
        novo3->prox = novo2;

		*cont = novo3;
        return;
}


void Login(conta **cont){
        conta *l;
        int con,se;
        while(1){
                system("cls || clear");
                printf("_-_-_-_-_-_-_-_-_-_-_-_-_-_-_- CAIXA ELETRONICO _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-\n\n");
                printf("Para sair digite 0 para a conta e 0 para senha\n");
                printf("Conta: ");
                scanf("%d",&con);
                printf("Senha: ",&se);
                scanf("%d",&se);
                if(con == 0 && se == 0){
                    printf("Ate a proxima\n");
                    return;
                }
                
                for(l = (*cont); l != NULL; l = l->prox){
                        if(l->nconta != con || l->senha != se){
                                continue;
                        }else{
                                if(l->flag == 1){
                                        menuGerente(cont);
                                }else{
                                        menuUsuario(cont);
                                }
                        }
                }
                printf("Conta nao encontrada\n");
        }
        return;
}

// fazer a tela inicial... com LOgin ou deposito
void Entrada(conta **cont){
	int resp = -1;
	while(resp != 3){
		system("cls || clear");
        printf("_-_-_-_-_-_-_-_-_-_-_-_-_-_-_- CAIXA ELETRONICO _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-\n\n");
        printf("1 - Acessar a Conta\n2 - Depositar \n3 - Sair\nO que voce quer fazer: ");
        scanf("%d",&resp);
        
        if(resp == 1)
        	Login(cont);
        if(resp == 2)
        	deposito(cont);
    }
    return;
}


int main (void){
      conta *listaconta;
      
      IniciaCaixa(&listaconta);

        
        
      Entrada(&listaconta);
        return 0;
}
